(function () {
    "use strict";

    angular.module('core').controller('tarefaDetailController', controller);
    controller.$inject = ['$scope', '$state', '$stateParams', '$q', '$alert', '$confirm', 'tarefaService', 'lookupService'];

    function controller($scope, $state, $stateParams, $q, $alert, $confirm, tarefaService, lookupService) {
        $scope.initializeLayout('Tarefa');

        //[Inicializa objetos]
        $scope.state = {
            item: { ID: decodeURIComponent($stateParams.id) },
            carregando: false,
            salvando: false,
            vazio: false,
        };
        $scope.auxiliar = {
            categoriaTarefa: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllCategoriaTarefa({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            grupoUsuario: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllGrupoUsuario({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            usuario: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllUsuario({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            empresa: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllEmpresa({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            contato: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllContato({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            chamado: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllChamado({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            demanda: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllDemanda({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            projeto: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllProjeto({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            classeStatus: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllClasseStatus({ chaves: chaves, filtro: { Classe: { ID: "7A0B9A80-B76D-49AA-8626-23A769AD5E0F" } } })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            modeloProcesso: {
                lookup: function (chaves) {
                    return $q.when(
                        lookupService
                            .getAllModeloProcesso({ chaves: chaves })
                            .then(function (response) {
                                if (response.Status < 0)
                                    $scope.tools.toastr.error(response.Message, "Serviço");
                                else
                                    return response.Data;
                            })
                    );
                }
            },
            situacao: {
                indicaNormal: function (item) {
                    return (!item?.UltimoAcompanhamento?.IndicaConcluido) &&
                        (new Date(item?.UltimoAcompanhamento?.Previsao?.TerminoEm).setHours(0, 0, 0, 0) > $scope.tools.date.hoje.setHours(0, 0, 0, 0))
                },
                indicaAtraso: function (item) {
                    return (!item?.UltimoAcompanhamento?.IndicaConcluido) &&
                        (new Date(item?.UltimoAcompanhamento?.Previsao?.TerminoEm).setHours(0, 0, 0, 0) < $scope.tools.date.hoje.setHours(0, 0, 0, 0))
                },
                indicaHoje: function (item) {
                    return (!item?.UltimoAcompanhamento?.IndicaConcluido) &&
                        (new Date(item?.UltimoAcompanhamento?.Previsao?.TerminoEm).setHours(0, 0, 0, 0) === $scope.tools.date.hoje.setHours(0, 0, 0, 0))
                },
            },
            statusMestre: {
                naoInicidad: 0,
                iniciado: 1,
                concluido: 2,
                cancelado: 3,
                aguardando: 4,
                reprovado: 5,
                suspenso: 6
            },
            estrutura: {
                data: [],
                carregando: false,
                get: async function () {
                    try {
                        $scope.auxiliar.estrutura.carregando = true;

                        const response = await tarefaService.getFullTree($scope.state.item.ID);

                        if (response.Status < 0) {
                            $scope.tools.toastr.error(response.Message, 'Serviço');
                        } else {
                            $scope.auxiliar.estrutura.data = response.Data;
                        }
                    }
                    catch (err) {
                        $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                        console.error(err);
                    }
                    finally {
                        $scope.auxiliar.estrutura.carregando = false;
                    }
                }
            }
        };

        //[Inicializa funcões]
        $scope.initialize = async function () {
            await $scope.refresh();
        };

        $scope.get = async function () {
            $scope.state.carregando = true;
            $scope.state.vazio = false;
            try {
                let response = await tarefaService.get($scope.state.item.ID);

                if (response.Status < 0) {
                    $scope.tools.toastr.error(response.Message, 'Serviço');
                } else {
                    $scope.state.item = response.Data;
                }
                $scope.state.vazio = !$scope.state.item;
                await $scope.auxiliar.estrutura.get();
            }
            catch (err) {
                $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                console.error(err);
            }
            finally {
                $scope.state.carregando = false;
            }
            $scope.$digest();
        };

        $scope.refresh = async function () {
            await $scope.get();
            
        };

        $scope.save = async function () {
            try {
                $scope.state.carregando = true;
                $scope.state.vazio = false;

                let response = await tarefaService.save($scope.state.item);

                if (response.Status < 0) {
                    $alert({ text: response.Message, title: $scope.Title });
                } else {
                    $scope.state.item = response.Data;
                    $scope.historyBack();
                }
                $scope.state.vazio = !$scope.state.item;
            }
            catch (err) {
                $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                console.error(err);
            }
            finally {
                $scope.state.carregando = false;
            }
        };
        $scope.delete = async function () {
            try {
                $scope.state.carregando = true;
                $scope.state.vazio = false;

                let response = await tarefaService.delete($scope.state.item.ID);
                if (response.Status < 0) {
                    $alert({ text: response.Message, title: $scope.Title });
                }
                else {
                    $scope.historyBack();
                }
                $scope.state.vazio = !$scope.state.item;
            }
            catch (err) {
                $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');
                console.error(err);
            }
            finally {
                $scope.state.carregando = false;
            }
        };
        $scope.prepare = async function () {
            try {
                $scope.state.vazio = false;

                let response = await tarefaService.prepare($scope.state.item);
                if (response.Status < 0) {
                    $scope.tools.toastr.error(response.Message, 'Serviço');
                } else {
                    $scope.state.item = response.Data;
                }
                $scope.state.vazio = !$scope.state.item;

            }
            catch (err) {

            }
            finally {
                $scope.tools.toastr.error('Não foi possível acessar o(s) servidor(es)');

            }
        };

        /*Inicializa funções*/
        $scope.initialize();

    }

})();